﻿using Db_Sqlite.dataTables;
using Microsoft.VisualBasic;
using Microsoft.VisualBasic.ApplicationServices;
using SQLite;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Db_Sqlite.DataAccess
{
    public sealed class StockDatabaseAsync : IAsyncDisposable
    {
        
        private readonly SQLiteAsyncConnection _database;
        /// <summary>
        /// 构造函数，接受一个字符串类型的数据库路径参数dbPath，用于创建一个新的SQLiteAsyncConnection对象并赋值给_database
        /// </summary>  
        public StockDatabaseAsync(string dbPath)
        {

            _database = new SQLiteAsyncConnection(dbPath);
        }

        /// <summary>
        /// 初始化数据库
        /// </summary>
        public async Task InitializeAsync()
        {
            // 创建TradeSummary表结构，如果表不存在则创建
            await _database.CreateTableAsync<DtList>();

            // 创建一个名为idx_trade_summary的索引，如果不存在的话。索引基于trade_summary表中的StockCode和TradeDate字段
            await _database.ExecuteAsync("""
            CREATE INDEX IF NOT EXISTS idx_DtList
            ON DtList(x3)
            """);
        }

        // 定义一个异步方法BulkUpsertTradeDataAsync，用于批量插入或更新交易数据
        public async Task BuckUpsertTradeDataAsync(
            IEnumerable<DtList> data)
        {
            // 在事务中执行操作，以确保数据的一致性
            await _database.RunInTransactionAsync(conn =>
            {
                // 关闭连接的跟踪功能，可能是为了提高性能
                conn.Trace = false;
                // 遍历要插入或更新的交易数据集合
                conn.InsertAll(data, "OR REPLACE");
            });
        }

        public async Task<List<Buyer>> GetDistinctBuyersAsync()
        {
            try
            {
                return await _database.QueryAsync<Buyer>(
                    "SELECT DISTINCT x12 FROM DtList"
                );
            }
            catch (SQLiteException ex)
            {
                // 如果查询失败，抛出异常
                throw new Exception("查询<买家会员名>失败", ex);

            }
            
        }

        public async Task<List<DtList>> GetTradeDataAsync(string salerName)
        {
            try
            {
                // 使用参数化查询来防止SQL注入
                return await _database.QueryAsync<DtList>(
                    string.Format("SELECT * FROM DtList where x9 = '{0}'", salerName)

                );
            }
            catch (SQLiteException ex)
            {
                // 如果查询失败，抛出异常
                throw new Exception("查询<交易记录>失败", ex);
            }
        }

        // 实现IAsyncDisposable接口的DisposeAsync方法，用于关闭数据库连接
        public async ValueTask DisposeAsync() =>
            await _database.CloseAsync();

    }


    public sealed class StockDatabase : IDisposable
    {

        private readonly SQLiteConnection _database;
        /// <summary>
        /// 构造函数，接受一个字符串类型的数据库路径参数dbPath，用于创建一个新的SQLiteAsyncConnection对象并赋值给_database
        /// </summary>  
        public StockDatabase(string dbPath)
        {
            _database = new SQLiteConnection(dbPath);
        }


        public List<Buyer> GetDistinctBuyers()
        {
            try
            {
                return _database.Query<Buyer>(
                    "SELECT DISTINCT x12 FROM DtList"
                );
            }
            catch (SQLiteException ex)
            {
                // 如果查询失败，抛出异常
                throw new Exception("查询<买家会员名>失败", ex);
                
            }

        }

        // 同步实现IDisposable接口
        public void Dispose()
        {
           
                _database.Close();
                _database.Dispose();
            
        }


    }
}
